
# 函数可以嵌套定义
# 内部函数只能在内部调用

def funx():
    print('i am funx')
    def fun2():
        print('i am fun2')
    fun2()

print(funx())


## 闭包
# 必须有一个内嵌的函数
# 内部函数引用外部变量
# 函数需要返回内嵌的函数

def funx():
    x=5
    def funy():
        nonlocal x
        # nonlocal python3增加的关键字，在上层找变量
        x+=1
        return x
    return funy


print(type(funx()))
print(funx()())


#
# y = ax+b

# 求某条固定直线的y点
def line1(x):
    return 2*x+5

print(line1(1))
print(line1(2))


# 兼容所有直线
def line2(a, b, x):
   return a*x+b


print(line2(2,5,1))
print(line2(2,5,2))
print(line2(2,6,1))
print(line2(2,6,2))

# 高阶函数（偏函数）
# 闭包
def line3(a, b):
    def line(x):
        return a*x+b
    return line

y_line1 = line3(2,5)
y_line2 = line3(2,6)

print(y_line1(1))
print(y_line1(2))

print(y_line2(1))
print(y_line2(2))


# 装饰器（在不改变程序代码的基础上，给程序添加功能）





